<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Make Controller Kit - Firmware API: system.c Source File</title>
<link href="mt_doxygen.css" rel="stylesheet" type="text/css" />
<link href="../resources/mt_doxytabs.css" rel="stylesheet" type="text/css" />
<style type="text/css">
<!--
.header {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 12pt;
	color: #222222;
}
-->
</style>
</head>

<body>
<table width="800" border="0">
    <tr>
      <td colspan="3">
        <form method="get" action="http://www.google.com/search">
          <div align="right">
            <input type="text"   name="q" size="25"
              maxlength="255" value="" />
            <input type="submit" value="Search" />
            <input type="hidden" name="sitesearch" value="makingthings.com/ref/firmware/html" />
          </div>
        </form>
       </td>
    </tr>
    <tr>
      <td><div align="center"><a href="http://www.makingthings.com">
				<img src="../resources/logo_brown_medium.png" alt="MakingThings"
									width="200" height="78" border="0" align="middle" longdesc="http://www.makingthings.com" /></a></div></td>
				<td><div align="center" class="header">
      		Make Controller Kit <br />
          Firmware API
      </div></td>
      <td><div align="center"><a href="http://www.makezine.com">
					<img src="../resources/make_logo.png" alt="MAKE Zine" 
										width="164" height="73" border="0" align="middle" longdesc="http://www.makezine.com" /></a></div></td>
    </tr>
</table>
</body>
</html>
<!-- Generated by Doxygen 1.5.4 -->
<script type="text/javascript">
<!--
function changeDisplayState (e){
  var num=this.id.replace(/[^[0-9]/g,'');
  var button=this.firstChild;
  var sectionDiv=document.getElementById('dynsection'+num);
  if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
    sectionDiv.style.display='block';
    button.src='open.gif';
  }else{
    sectionDiv.style.display='none';
    button.src='closed.gif';
  }
}
function initDynSections(){
  var divs=document.getElementsByTagName('div');
  var sectionCounter=1;
  for(var i=0;i<divs.length-1;i++){
    if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
      var header=divs[i];
      var section=divs[i+1];
      var button=header.firstChild;
      if (button!='IMG'){
        divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
        button=document.createElement('img');
        divs[i].insertBefore(button,divs[i].firstChild);
      }
      header.style.cursor='pointer';
      header.onclick=changeDisplayState;
      header.id='dynheader'+sectionCounter;
      button.src='closed.gif';
      section.id='dynsection'+sectionCounter;
      section.style.display='none';
      section.style.marginLeft='14px';
      sectionCounter++;
    }
  }
}
window.onload = initDynSections;
-->
</script>
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
    <li class="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  </ul>
</div>
<h1>system.c</h1><a href="system_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*********************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment"></span>
<a name="l00003"></a>00003 <span class="comment"> Copyright 2006 MakingThings</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment"> Licensed under the Apache License, </span>
<a name="l00006"></a>00006 <span class="comment"> Version 2.0 (the "License"); you may not use this file except in compliance </span>
<a name="l00007"></a>00007 <span class="comment"> with the License. You may obtain a copy of the License at</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment"> http://www.apache.org/licenses/LICENSE-2.0 </span>
<a name="l00010"></a>00010 <span class="comment"> </span>
<a name="l00011"></a>00011 <span class="comment"> Unless required by applicable law or agreed to in writing, software distributed</span>
<a name="l00012"></a>00012 <span class="comment"> under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR</span>
<a name="l00013"></a>00013 <span class="comment"> CONDITIONS OF ANY KIND, either express or implied. See the License for</span>
<a name="l00014"></a>00014 <span class="comment"> the specific language governing permissions and limitations under the License.</span>
<a name="l00015"></a>00015 <span class="comment"></span>
<a name="l00016"></a>00016 <span class="comment">*********************************************************************************/</span>
<a name="l00017"></a>00017 <span class="comment"></span>
<a name="l00018"></a>00018 <span class="comment">/** \file system.c  </span>
<a name="l00019"></a>00019 <span class="comment">  System Control.</span>
<a name="l00020"></a>00020 <span class="comment">  Functions for monitoring and controlling the system.</span>
<a name="l00021"></a>00021 <span class="comment">*/</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="preprocessor">#include "stdio.h"</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "string.h"</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "ctype.h"</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "io.h"</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "eeprom.h"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "system.h"</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "config.h"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "AT91SAM7X256.h"</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include "network.h"</span>
<a name="l00032"></a>00032 
<a name="l00033"></a>00033 <span class="keywordtype">int</span> PortFreeMemory( <span class="keywordtype">void</span> );
<a name="l00034"></a>00034 <span class="keywordtype">void</span> StackAuditTask( <span class="keywordtype">void</span>* p );
<a name="l00035"></a>00035 <span class="keywordtype">void</span> kill( <span class="keywordtype">void</span> );
<a name="l00036"></a>00036 <span class="preprocessor">#define ASYNC_INIT -10</span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define ASYNC_INACTIVE -1</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span>
<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keyword">struct </span>System_
<a name="l00040"></a>00040 {
<a name="l00041"></a>00041   <span class="keywordtype">char</span> name[ SYSTEM_MAX_NAME + 1 ]; <span class="comment">// allotted EEPROM space is 100, but leave room for \0!</span>
<a name="l00042"></a>00042   <span class="keywordtype">int</span> users;
<a name="l00043"></a>00043   <span class="keywordtype">void</span>* StackAuditPtr;
<a name="l00044"></a>00044 <span class="preprocessor">  #ifdef OSC</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span>  <span class="keywordtype">char</span> scratch1[ OSC_SCRATCH_SIZE ];
<a name="l00046"></a>00046   <span class="keywordtype">int</span> asyncDestination;
<a name="l00047"></a>00047   <span class="keywordtype">int</span> autoInterval;
<a name="l00048"></a>00048 <span class="preprocessor">  #endif // OSC</span>
<a name="l00049"></a>00049 <span class="preprocessor"></span>} SystemS;
<a name="l00050"></a>00050 
<a name="l00051"></a>00051 SystemS* System;
<a name="l00052"></a>00052 <span class="comment"></span>
<a name="l00053"></a>00053 <span class="comment">/** \defgroup System</span>
<a name="l00054"></a>00054 <span class="comment">    The System subsystem monitors and controls several aspects of the system. </span>
<a name="l00055"></a>00055 <span class="comment"></span>
<a name="l00056"></a>00056 <span class="comment">* \ingroup Controller</span>
<a name="l00057"></a>00057 <span class="comment">* @{</span>
<a name="l00058"></a>00058 <span class="comment">*/</span>
<a name="l00059"></a>00059 <span class="comment"></span>
<a name="l00060"></a>00060 <span class="comment">/**</span>
<a name="l00061"></a>00061 <span class="comment">  Sets whether the System subsystem is active.</span>
<a name="l00062"></a>00062 <span class="comment">  @param state An integer specifying the state system</span>
<a name="l00063"></a>00063 <span class="comment">  @return Zero on success.</span>
<a name="l00064"></a>00064 <span class="comment">*/</span>
<a name="l00065"></a><a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706">00065</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( <span class="keywordtype">int</span> state )
<a name="l00066"></a>00066 {
<a name="l00067"></a>00067   <span class="keywordflow">if</span>( state )
<a name="l00068"></a>00068   {
<a name="l00069"></a>00069     <span class="keywordflow">if</span>( System == NULL )
<a name="l00070"></a>00070     {
<a name="l00071"></a>00071       System = <a class="code" href="group___utils.html#g95923aa748602fa0330903fca05ca892" title="Same as Malloc, but keeps trying until it succeeds.">MallocWait</a>( <span class="keyword">sizeof</span>( SystemS ), 100 );
<a name="l00072"></a>00072       System-&gt;name[0] = 0;
<a name="l00073"></a>00073       System-&gt;StackAuditPtr = NULL;
<a name="l00074"></a>00074       System-&gt;asyncDestination = ASYNC_INIT;
<a name="l00075"></a>00075       System-&gt;asyncDestination = System_GetAsyncDestination( );
<a name="l00076"></a>00076       System-&gt;autoInterval = ASYNC_INIT;
<a name="l00077"></a>00077       System-&gt;autoInterval = System_GetAutoSendInterval( );
<a name="l00078"></a>00078     }
<a name="l00079"></a>00079     <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00080"></a>00080   }
<a name="l00081"></a>00081   <span class="keywordflow">else</span>
<a name="l00082"></a>00082   {
<a name="l00083"></a>00083     <span class="keywordflow">if</span> ( System != NULL )
<a name="l00084"></a>00084     {
<a name="l00085"></a>00085       <a class="code" href="group___utils.html#g6b0be54448d6ce393134400f4b22fa97" title="Free memory from the heap.">Free</a>( System );
<a name="l00086"></a>00086       System = NULL;
<a name="l00087"></a>00087     }
<a name="l00088"></a>00088     <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00089"></a>00089   }
<a name="l00090"></a>00090 }
<a name="l00091"></a>00091 <span class="comment"></span>
<a name="l00092"></a>00092 <span class="comment">/**</span>
<a name="l00093"></a>00093 <span class="comment">  Returns the active state of the subsystem.</span>
<a name="l00094"></a>00094 <span class="comment">  @return The active state of the subsystem - 1 (active) or 0 (inactive).</span>
<a name="l00095"></a>00095 <span class="comment">*/</span>
<a name="l00096"></a><a class="code" href="group___system.html#gf69f323f13e699e179290d1857ef2ef8">00096</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#gf69f323f13e699e179290d1857ef2ef8" title="Returns the active state of the subsystem.">System_GetActive</a>( )
<a name="l00097"></a>00097 {
<a name="l00098"></a>00098   <span class="keywordflow">return</span> System != NULL;
<a name="l00099"></a>00099 }
<a name="l00100"></a>00100 <span class="comment"></span>
<a name="l00101"></a>00101 <span class="comment">/**</span>
<a name="l00102"></a>00102 <span class="comment">  Returns the free size of the heap.</span>
<a name="l00103"></a>00103 <span class="comment">  @return The size free memory.</span>
<a name="l00104"></a>00104 <span class="comment">*/</span>
<a name="l00105"></a><a class="code" href="group___system.html#g70856cdb0248591e1ddc44d1ca96e475">00105</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#g70856cdb0248591e1ddc44d1ca96e475" title="Returns the free size of the heap.">System_GetFreeMemory</a>( <span class="keywordtype">void</span> )
<a name="l00106"></a>00106 {
<a name="l00107"></a>00107   <span class="keywordflow">return</span> PortFreeMemory();
<a name="l00108"></a>00108 }
<a name="l00109"></a>00109 <span class="comment"></span>
<a name="l00110"></a>00110 <span class="comment">/**</span>
<a name="l00111"></a>00111 <span class="comment">  Gets the board's Serial Number.  </span>
<a name="l00112"></a>00112 <span class="comment">  @return CONTROLLER_OK ( = 0 ).</span>
<a name="l00113"></a>00113 <span class="comment">*/</span>
<a name="l00114"></a><a class="code" href="group___system.html#g42dad93cdc36c55a34f225982a0ff753">00114</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#g42dad93cdc36c55a34f225982a0ff753" title="Gets the board&amp;#39;s Serial Number.">System_GetSerialNumber</a>( <span class="keywordtype">void</span> )
<a name="l00115"></a>00115 {
<a name="l00116"></a>00116   <span class="keywordtype">int</span> serial;
<a name="l00117"></a>00117   <span class="keywordflow">if</span> ( <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_SYSTEM_SERIAL_NUMBER, (uchar*)&amp;serial, 4 ) == <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a> )
<a name="l00118"></a>00118     <span class="keywordflow">return</span> serial &amp; 0xFFFF;
<a name="l00119"></a>00119   <span class="keywordflow">return</span> 0;
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121 <span class="comment"></span>
<a name="l00122"></a>00122 <span class="comment">/**</span>
<a name="l00123"></a>00123 <span class="comment">  Sets the Serial Number. Note that this can be changed by the user at </span>
<a name="l00124"></a>00124 <span class="comment">  any time, but that it is used in the \ref Network subsystem to form the last </span>
<a name="l00125"></a>00125 <span class="comment">  two bytes of the network MAC address, so ideally units on the same network</span>
<a name="l00126"></a>00126 <span class="comment">  should have unique serial numbers.</span>
<a name="l00127"></a>00127 <span class="comment">  @return CONTROLLER_OK if OK.</span>
<a name="l00128"></a>00128 <span class="comment">*/</span>
<a name="l00129"></a><a class="code" href="group___system.html#g158e76fe4fcb24e3cce77d64c9e018ed">00129</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#g158e76fe4fcb24e3cce77d64c9e018ed" title="Sets the Serial Number.">System_SetSerialNumber</a>( <span class="keywordtype">int</span> serial )
<a name="l00130"></a>00130 {
<a name="l00131"></a>00131   serial &amp;= 0xFFFF;
<a name="l00132"></a>00132   <span class="keywordflow">return</span> <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_SYSTEM_SERIAL_NUMBER, (uchar*)&amp;serial, 4 );
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134 <span class="comment"></span>
<a name="l00135"></a>00135 <span class="comment">/**</span>
<a name="l00136"></a>00136 <span class="comment">  Returns the board to SAM-BA mode, erasing the flash memory.</span>
<a name="l00137"></a>00137 <span class="comment">  Leaves the board in a non-deterministic state awaiting a power cycle or reset.</span>
<a name="l00138"></a>00138 <span class="comment">  @return CONTROLLER_OK if OK.</span>
<a name="l00139"></a>00139 <span class="comment">*/</span>
<a name="l00140"></a><a class="code" href="group___system.html#g2c73f861f3856f1189f139d08835f8c1">00140</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#g2c73f861f3856f1189f139d08835f8c1" title="Returns the board to SAM-BA mode, erasing the flash memory.">System_SetSamba</a>( <span class="keywordtype">int</span> sure )
<a name="l00141"></a>00141 {
<a name="l00142"></a>00142   <span class="keywordflow">if</span> ( sure )
<a name="l00143"></a>00143   {
<a name="l00144"></a>00144     <span class="comment">// Wait for End Of Programming</span>
<a name="l00145"></a>00145     <span class="keywordflow">while</span>( !(AT91C_BASE_MC-&gt;MC_FSR &amp; AT91C_MC_FRDY) );
<a name="l00146"></a>00146     
<a name="l00147"></a>00147     <span class="comment">// Send Boot From Flash Command</span>
<a name="l00148"></a>00148     AT91C_BASE_MC-&gt;MC_FCR = (AT91C_MC_FCMD_CLR_GP_NVM |  (( (2) &lt;&lt; 8) &amp; AT91C_MC_PAGEN) | (0x5A &lt;&lt; 24));
<a name="l00149"></a>00149 
<a name="l00150"></a>00150     AT91C_BASE_RSTC-&gt;RSTC_RCR = ( AT91C_RSTC_EXTRST | AT91C_RSTC_PROCRST | AT91C_RSTC_PERRST | (0xA5 &lt;&lt; 24 ) );
<a name="l00151"></a>00151 
<a name="l00152"></a>00152     <span class="comment">// Wait for End Of Programming</span>
<a name="l00153"></a>00153     <span class="keywordflow">while</span>( !(AT91C_BASE_MC-&gt;MC_FSR &amp; AT91C_MC_FRDY) );
<a name="l00154"></a>00154   
<a name="l00155"></a>00155     <span class="keywordflow">if</span> ( AT91C_BASE_MC-&gt;MC_FSR &amp; AT91C_MC_PROGE )
<a name="l00156"></a>00156       <span class="keywordflow">return</span> 0;
<a name="l00157"></a>00157   
<a name="l00158"></a>00158     <span class="keywordflow">if</span> ( AT91C_BASE_MC-&gt;MC_FSR &amp; AT91C_MC_GPNVM2 )
<a name="l00159"></a>00159       <span class="keywordflow">return</span> 0;
<a name="l00160"></a>00160   }
<a name="l00161"></a>00161 
<a name="l00162"></a>00162   <span class="comment">// Never will do this</span>
<a name="l00163"></a>00163   <span class="keywordflow">return</span> 1;
<a name="l00164"></a>00164 }
<a name="l00165"></a>00165 <span class="comment"></span>
<a name="l00166"></a>00166 <span class="comment">/**</span>
<a name="l00167"></a>00167 <span class="comment">  Gives the board a name.</span>
<a name="l00168"></a>00168 <span class="comment">  The name must be alpha-numeric - only letters and numbers.</span>
<a name="l00169"></a>00169 <span class="comment">  @param name A string specifying the board's name</span>
<a name="l00170"></a>00170 <span class="comment">  @return CONTROLLER_OK if OK.</span>
<a name="l00171"></a>00171 <span class="comment">*/</span>
<a name="l00172"></a><a class="code" href="group___system.html#gfba0e52d7c1b37ba36cf8172e005ffd1">00172</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#gfba0e52d7c1b37ba36cf8172e005ffd1" title="Gives the board a name.">System_SetName</a>( <span class="keywordtype">char</span>* name )
<a name="l00173"></a>00173 {
<a name="l00174"></a>00174   <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( 1 );
<a name="l00175"></a>00175   <span class="keywordtype">int</span> length = strlen( name );
<a name="l00176"></a>00176   <span class="keywordflow">if</span>( length &gt; SYSTEM_MAX_NAME )
<a name="l00177"></a>00177     <span class="keywordflow">return</span> <a class="code" href="group___error.html#gb5e5ae7f5607418082cf8d9c09a06ef2" title="Specified string is too long.">CONTROLLER_ERROR_STRING_TOO_LONG</a>;
<a name="l00178"></a>00178   
<a name="l00179"></a>00179   strcpy( System-&gt;name, name ); <span class="comment">// update the name in our buffer</span>
<a name="l00180"></a>00180   <span class="keywordtype">int</span> i;
<a name="l00181"></a>00181   <span class="keywordtype">char</span>* ptr = name;
<a name="l00182"></a>00182   <span class="keywordflow">for</span>( i = 0; i &lt;= length; i++ ) <span class="comment">// have to do this because Eeprom_Write can only go 32 at a time.</span>
<a name="l00183"></a>00183   {
<a name="l00184"></a>00184     <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_SYSTEM_NAME + i, (uchar*)ptr++, 1 );
<a name="l00185"></a>00185   }
<a name="l00186"></a>00186 
<a name="l00187"></a>00187   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00188"></a>00188 }
<a name="l00189"></a>00189 <span class="comment"></span>
<a name="l00190"></a>00190 <span class="comment">/**</span>
<a name="l00191"></a>00191 <span class="comment">  Read the board's name.</span>
<a name="l00192"></a>00192 <span class="comment">  @return The board's name as a string.</span>
<a name="l00193"></a>00193 <span class="comment">*/</span>
<a name="l00194"></a><a class="code" href="group___system.html#g1bcad57269385df99b23c8e9de3f81fc">00194</a> <span class="keywordtype">char</span>* <a class="code" href="group___system.html#g1bcad57269385df99b23c8e9de3f81fc" title="Read the board&amp;#39;s name.">System_GetName</a>( )
<a name="l00195"></a>00195 {
<a name="l00196"></a>00196   <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( 1 );
<a name="l00197"></a>00197   <span class="keywordflow">if</span>( System-&gt;name[0] == 0 )
<a name="l00198"></a>00198   {
<a name="l00199"></a>00199     <span class="keywordtype">char</span>* ptr;
<a name="l00200"></a>00200     ptr = System-&gt;name;
<a name="l00201"></a>00201     <span class="keywordtype">int</span> i;
<a name="l00202"></a>00202     <span class="keywordtype">bool</span> legal = <span class="keyword">false</span>;
<a name="l00203"></a>00203     <span class="keywordflow">for</span>( i = 0; i &lt;= SYSTEM_MAX_NAME; i++ )
<a name="l00204"></a>00204     {
<a name="l00205"></a>00205       <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_SYSTEM_NAME + i, (uchar*)ptr, 1 );
<a name="l00206"></a>00206       <span class="keywordflow">if</span>( *ptr == 0 )
<a name="l00207"></a>00207         <span class="keywordflow">break</span>;
<a name="l00208"></a>00208       <span class="keywordflow">if</span>( !isalnum( *ptr ) &amp;&amp; *ptr != <span class="charliteral">' '</span> )
<a name="l00209"></a>00209       {
<a name="l00210"></a>00210         legal = <span class="keyword">false</span>;
<a name="l00211"></a>00211         <span class="keywordflow">break</span>;
<a name="l00212"></a>00212       }
<a name="l00213"></a>00213       legal = <span class="keyword">true</span>;
<a name="l00214"></a>00214       
<a name="l00215"></a>00215       <span class="keywordflow">if</span>( i == SYSTEM_MAX_NAME &amp;&amp; *ptr != 0 )
<a name="l00216"></a>00216         *ptr = 0;
<a name="l00217"></a>00217       ptr++;
<a name="l00218"></a>00218     }
<a name="l00219"></a>00219 
<a name="l00220"></a>00220     <span class="keywordflow">if</span>( !legal )
<a name="l00221"></a>00221     {
<a name="l00222"></a>00222       strcpy( System-&gt;name, <span class="stringliteral">"Make Controller Kit"</span> );
<a name="l00223"></a>00223       <a class="code" href="group___system.html#gfba0e52d7c1b37ba36cf8172e005ffd1" title="Gives the board a name.">System_SetName</a>( System-&gt;name );
<a name="l00224"></a>00224     }
<a name="l00225"></a>00225   }
<a name="l00226"></a>00226 
<a name="l00227"></a>00227   <span class="keywordflow">return</span> System-&gt;name;
<a name="l00228"></a>00228 }
<a name="l00229"></a>00229 <span class="comment"></span>
<a name="l00230"></a>00230 <span class="comment">/**</span>
<a name="l00231"></a>00231 <span class="comment">  Reset the board.</span>
<a name="l00232"></a>00232 <span class="comment">  Will reboot the board if the parameter sure is true.</span>
<a name="l00233"></a>00233 <span class="comment">  @param sure confirms the request is true.</span>
<a name="l00234"></a>00234 <span class="comment">  @return CONTROLLER_OK if OK.</span>
<a name="l00235"></a>00235 <span class="comment">*/</span>
<a name="l00236"></a><a class="code" href="group___system.html#g70fc8e90a5c3dd0a36f7c2b4fe0a8bfc">00236</a> <span class="keywordtype">int</span> <a class="code" href="group___system.html#g70fc8e90a5c3dd0a36f7c2b4fe0a8bfc" title="Reset the board.">System_SetReset</a>( <span class="keywordtype">int</span> sure )
<a name="l00237"></a>00237 {
<a name="l00238"></a>00238   <span class="keywordflow">if</span> ( sure )
<a name="l00239"></a>00239     kill( );
<a name="l00240"></a>00240 
<a name="l00241"></a>00241   <span class="keywordflow">return</span> 1;
<a name="l00242"></a>00242 }
<a name="l00243"></a>00243 <span class="comment"></span>
<a name="l00244"></a>00244 <span class="comment">/** @}</span>
<a name="l00245"></a>00245 <span class="comment">*/</span>
<a name="l00246"></a>00246 
<a name="l00247"></a>00247 <span class="keywordtype">void</span> kill( <span class="keywordtype">void</span> )
<a name="l00248"></a>00248 {
<a name="l00249"></a>00249   AT91C_BASE_RSTC-&gt;RSTC_RCR = ( AT91C_RSTC_EXTRST | AT91C_RSTC_PROCRST | AT91C_RSTC_PERRST | (0xA5 &lt;&lt; 24 ) );
<a name="l00250"></a>00250 }
<a name="l00251"></a>00251 
<a name="l00252"></a>00252 <span class="preprocessor">#ifdef OSC</span>
<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#include "osc.h"</span>
<a name="l00254"></a>00254 
<a name="l00255"></a>00255 <span class="keywordtype">void</span> System_StackAudit( <span class="keywordtype">int</span> on_off )
<a name="l00256"></a>00256 {
<a name="l00257"></a>00257   <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( 1 );
<a name="l00258"></a>00258   <span class="keywordflow">if</span>( System-&gt;StackAuditPtr == NULL &amp;&amp; on_off )
<a name="l00259"></a>00259     System-&gt;StackAuditPtr = <a class="code" href="group___tasks.html#g784f87fb45eebb76d07478036ed228d3" title="Create a new task.">TaskCreate</a>( StackAuditTask, <span class="stringliteral">"StackAudit"</span>, 700, 0, 5 );
<a name="l00260"></a>00260   
<a name="l00261"></a>00261   <span class="keywordflow">if</span>( System-&gt;StackAuditPtr != NULL &amp;&amp; !on_off )
<a name="l00262"></a>00262   {
<a name="l00263"></a>00263     <a class="code" href="group___tasks.html#g5bc41573c59208d32d999e2f394ad3ce" title="Delete an existing task.">TaskDelete</a>( System-&gt;StackAuditPtr );
<a name="l00264"></a>00264     System-&gt;StackAuditPtr = NULL;
<a name="l00265"></a>00265   }
<a name="l00266"></a>00266 }
<a name="l00267"></a>00267 
<a name="l00268"></a>00268 <span class="keywordtype">void</span> StackAuditTask( <span class="keywordtype">void</span>* p )
<a name="l00269"></a>00269 {
<a name="l00270"></a>00270   (void)p;
<a name="l00271"></a>00271   <span class="keywordtype">void</span>* task = NULL;
<a name="l00272"></a>00272   <span class="keywordflow">while</span>( 1 )
<a name="l00273"></a>00273   {
<a name="l00274"></a>00274     task = <a class="code" href="group___tasks.html#ga8d7aef54edaea894b5f5e9cd6c53eae" title="Get a pointer to the task whose ID comes after a given ID.">TaskGetNext</a>( task );
<a name="l00275"></a>00275     <span class="keywordtype">int</span> stackremaining = <a class="code" href="group___tasks.html#gbce595eac3d0cfb96b1cd9037a613ef8" title="Check how much stack is available for a given task.">TaskGetRemainingStack</a>( task );
<a name="l00276"></a>00276     <span class="keywordflow">if</span>( stackremaining &lt; 50 )
<a name="l00277"></a>00277     {
<a name="l00278"></a>00278       <a class="code" href="group___led.html#g64a0db609a52e4ef919b13e62f3557a9" title="Control the LED on the MAKE Controller Board.">Led_SetState</a>( 1 );
<a name="l00279"></a>00279       <a class="code" href="group___debug.html#g17dd929959ff7576dbccb05e4b69a012" title="Create a debug message.">Debug</a>( <a class="code" href="group___debug.html#g8a4e4885193c12b840ff3cbedec2451d" title="Used for warnings.">DEBUG_WARNING</a>, <span class="stringliteral">"Warning: Stack running low on task %s. %d bytes left."</span>, <a class="code" href="group___tasks.html#ga15296e2b927abaadce9ed3028917afd" title="Get the name of a task.">TaskGetName</a>( task ), stackremaining );
<a name="l00280"></a>00280     }
<a name="l00281"></a>00281 
<a name="l00282"></a>00282     <span class="keywordtype">int</span> freemem = <a class="code" href="group___system.html#g70856cdb0248591e1ddc44d1ca96e475" title="Returns the free size of the heap.">System_GetFreeMemory</a>( );
<a name="l00283"></a>00283     <span class="keywordflow">if</span>( freemem &lt; 100 )
<a name="l00284"></a>00284     {
<a name="l00285"></a>00285       <a class="code" href="group___led.html#g64a0db609a52e4ef919b13e62f3557a9" title="Control the LED on the MAKE Controller Board.">Led_SetState</a>( 1 );
<a name="l00286"></a>00286       <a class="code" href="group___debug.html#g17dd929959ff7576dbccb05e4b69a012" title="Create a debug message.">Debug</a>( <a class="code" href="group___debug.html#g8a4e4885193c12b840ff3cbedec2451d" title="Used for warnings.">DEBUG_WARNING</a>, <span class="stringliteral">"Warning: System memory running low. %d bytes left."</span>, freemem );
<a name="l00287"></a>00287     }
<a name="l00288"></a>00288     
<a name="l00289"></a>00289     <a class="code" href="group___tasks.html#g9a64a7c0e24f257826103d1d1bbb44fa" title="Put a task to sleep for a given number of milliseconds.">Sleep</a>( 5 );
<a name="l00290"></a>00290   }
<a name="l00291"></a>00291 }
<a name="l00292"></a>00292 
<a name="l00293"></a>00293 <span class="keywordtype">void</span> System_SetAsyncDestination( <span class="keywordtype">int</span> dest )
<a name="l00294"></a>00294 {
<a name="l00295"></a>00295   <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( 1 );
<a name="l00296"></a>00296   <span class="keywordflow">if</span>( dest &lt; ASYNC_INACTIVE || dest &gt; (OSC_CHANNEL_COUNT-1) )
<a name="l00297"></a>00297     <span class="keywordflow">return</span>;
<a name="l00298"></a>00298   <span class="keywordflow">else</span>
<a name="l00299"></a>00299   {
<a name="l00300"></a>00300     <span class="keywordflow">if</span>( System-&gt;asyncDestination != dest )
<a name="l00301"></a>00301     {
<a name="l00302"></a>00302       System-&gt;asyncDestination = dest;
<a name="l00303"></a>00303       <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_OSC_ASYNC_DEST, (uchar*)&amp;dest, 4 );
<a name="l00304"></a>00304     }
<a name="l00305"></a>00305   }
<a name="l00306"></a>00306 }
<a name="l00307"></a>00307 
<a name="l00308"></a>00308 <span class="keywordtype">int</span> System_GetAsyncDestination( )
<a name="l00309"></a>00309 {
<a name="l00310"></a>00310   <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( 1 );
<a name="l00311"></a>00311   <span class="keywordflow">if</span>( System-&gt;asyncDestination == ASYNC_INIT )
<a name="l00312"></a>00312   {
<a name="l00313"></a>00313     <span class="keywordtype">int</span> async;
<a name="l00314"></a>00314     <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_OSC_ASYNC_DEST, (uchar*)&amp;async, 4 );
<a name="l00315"></a>00315     <span class="keywordflow">if</span>( async &gt;= 0 &amp;&amp; async &lt;= (OSC_CHANNEL_COUNT-1) )
<a name="l00316"></a>00316       System-&gt;asyncDestination = async;
<a name="l00317"></a>00317     <span class="keywordflow">else</span>
<a name="l00318"></a>00318       System-&gt;asyncDestination = ASYNC_INACTIVE;
<a name="l00319"></a>00319   }
<a name="l00320"></a>00320   <span class="keywordflow">return</span> System-&gt;asyncDestination;
<a name="l00321"></a>00321 }
<a name="l00322"></a>00322 
<a name="l00323"></a>00323 <span class="keywordtype">void</span> System_SetAutoSendInterval( <span class="keywordtype">int</span> interval )
<a name="l00324"></a>00324 {
<a name="l00325"></a>00325   <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( 1 );
<a name="l00326"></a>00326   <span class="keywordflow">if</span>( interval &lt; 0 || interval &gt; 5000 )
<a name="l00327"></a>00327     <span class="keywordflow">return</span>;
<a name="l00328"></a>00328   <span class="keywordflow">else</span>
<a name="l00329"></a>00329   {
<a name="l00330"></a>00330     <span class="keywordflow">if</span>( System-&gt;autoInterval != interval )
<a name="l00331"></a>00331     {
<a name="l00332"></a>00332       System-&gt;autoInterval = interval;
<a name="l00333"></a>00333       <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_OSC_ASYNC_INTERVAL, (uchar*)&amp;interval, 4 );
<a name="l00334"></a>00334     }
<a name="l00335"></a>00335   }
<a name="l00336"></a>00336 }
<a name="l00337"></a>00337 
<a name="l00338"></a>00338 <span class="keywordtype">int</span> System_GetAutoSendInterval( )
<a name="l00339"></a>00339 {
<a name="l00340"></a>00340   <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( 1 );
<a name="l00341"></a>00341   <span class="keywordflow">if</span>( System-&gt;autoInterval == ASYNC_INIT )
<a name="l00342"></a>00342   {
<a name="l00343"></a>00343     <span class="keywordtype">int</span> interval;
<a name="l00344"></a>00344     <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_OSC_ASYNC_INTERVAL, (uchar*)&amp;interval, 4 );
<a name="l00345"></a>00345     <span class="keywordflow">if</span>( interval &gt;= 0 &amp;&amp; interval &lt;= 5000 )
<a name="l00346"></a>00346       System-&gt;autoInterval = interval;
<a name="l00347"></a>00347     <span class="keywordflow">else</span>
<a name="l00348"></a>00348       System-&gt;autoInterval = 10;
<a name="l00349"></a>00349   }
<a name="l00350"></a>00350   <span class="keywordflow">return</span> System-&gt;autoInterval;
<a name="l00351"></a>00351 }
<a name="l00352"></a>00352 <span class="comment"></span>
<a name="l00353"></a>00353 <span class="comment">/** \defgroup SystemOSC System - OSC</span>
<a name="l00354"></a>00354 <span class="comment">  System controls many of the logistics of the Controller Board via OSC.</span>
<a name="l00355"></a>00355 <span class="comment">  \ingroup OSC</span>
<a name="l00356"></a>00356 <span class="comment">   </span>
<a name="l00357"></a>00357 <span class="comment">    \section devices Devices</span>
<a name="l00358"></a>00358 <span class="comment">    There's only one System, so a device index is not used in OSC messages to it.</span>
<a name="l00359"></a>00359 <span class="comment">   </span>
<a name="l00360"></a>00360 <span class="comment">    \section properties Properties</span>
<a name="l00361"></a>00361 <span class="comment">    System has eight properties:</span>
<a name="l00362"></a>00362 <span class="comment">    - name</span>
<a name="l00363"></a>00363 <span class="comment">    - freememory</span>
<a name="l00364"></a>00364 <span class="comment">    - samba</span>
<a name="l00365"></a>00365 <span class="comment">    - reset</span>
<a name="l00366"></a>00366 <span class="comment">    - serialnumber</span>
<a name="l00367"></a>00367 <span class="comment">    - version</span>
<a name="l00368"></a>00368 <span class="comment">    - stack-audit</span>
<a name="l00369"></a>00369 <span class="comment">    - task-report</span>
<a name="l00370"></a>00370 <span class="comment">    - active</span>
<a name="l00371"></a>00371 <span class="comment"></span>
<a name="l00372"></a>00372 <span class="comment">    \par Name</span>
<a name="l00373"></a>00373 <span class="comment">    The \b name property allows you to give a board its own name.  The name can only contain </span>
<a name="l00374"></a>00374 <span class="comment">    alphabetic characters and numbers.</span>
<a name="l00375"></a>00375 <span class="comment">    To set your board's name, send the message</span>
<a name="l00376"></a>00376 <span class="comment">    \verbatim /system/name "My Board"\endverbatim</span>
<a name="l00377"></a>00377 <span class="comment">    To read the board's name, send the message</span>
<a name="l00378"></a>00378 <span class="comment">    \verbatim /system/name \endverbatim</span>
<a name="l00379"></a>00379 <span class="comment">    The board will respond by sending back an OSC message with the board's name.</span>
<a name="l00380"></a>00380 <span class="comment">    </span>
<a name="l00381"></a>00381 <span class="comment">    \par Free Memory</span>
<a name="l00382"></a>00382 <span class="comment">    The \b freememory property corresponds to the amount of free memory on the Controller Board.</span>
<a name="l00383"></a>00383 <span class="comment">    This value is read-only.  To get the amount of free memory, send the message</span>
<a name="l00384"></a>00384 <span class="comment">    \verbatim /system/freememory \endverbatim</span>
<a name="l00385"></a>00385 <span class="comment">    The board will respond by sending back an OSC message with the amount of free memory.</span>
<a name="l00386"></a>00386 <span class="comment">   </span>
<a name="l00387"></a>00387 <span class="comment">    \par Samba</span>
<a name="l00388"></a>00388 <span class="comment">    The \b samba property is a write-only value that returns the board to a state in which it's ready</span>
<a name="l00389"></a>00389 <span class="comment">    to receive new firmware via SAM-BA or mchelper.  Once you've set the board to SAM-BA state,</span>
<a name="l00390"></a>00390 <span class="comment">    unplug and replug the power on the board before uploading new firmware.</span>
<a name="l00391"></a>00391 <span class="comment">    \par</span>
<a name="l00392"></a>00392 <span class="comment">    To set the board in SAM-BA state, send the message</span>
<a name="l00393"></a>00393 <span class="comment">    \verbatim /system/samba 1 \endverbatim</span>
<a name="l00394"></a>00394 <span class="comment">    and don't forget to power cycle the board.  Remember the board won't be able to send/receive OSC</span>
<a name="l00395"></a>00395 <span class="comment">    messages until a new program is uploaded to it.</span>
<a name="l00396"></a>00396 <span class="comment">   </span>
<a name="l00397"></a>00397 <span class="comment">    \par Reset</span>
<a name="l00398"></a>00398 <span class="comment">    The \b reset property is a write-only value that reboots the board.</span>
<a name="l00399"></a>00399 <span class="comment">    To reset the board, send the message</span>
<a name="l00400"></a>00400 <span class="comment">    \verbatim /system/reset 1 \endverbatim</span>
<a name="l00401"></a>00401 <span class="comment">   </span>
<a name="l00402"></a>00402 <span class="comment">    \par Serial Number</span>
<a name="l00403"></a>00403 <span class="comment">    The \b serialnumber property corresponds to the unique serial number on each Controller Board.</span>
<a name="l00404"></a>00404 <span class="comment">    This value can be used in situations where a unique value needs to be used to identify a board.</span>
<a name="l00405"></a>00405 <span class="comment">    The serial number can be both read and written.</span>
<a name="l00406"></a>00406 <span class="comment">    \par</span>
<a name="l00407"></a>00407 <span class="comment">    To read the board's serial number, send the message</span>
<a name="l00408"></a>00408 <span class="comment">    \verbatim /system/serialnumber \endverbatim</span>
<a name="l00409"></a>00409 <span class="comment">   </span>
<a name="l00410"></a>00410 <span class="comment">    \par Version</span>
<a name="l00411"></a>00411 <span class="comment">    The \b version property corresponds to the of the firmware currently running on the board.</span>
<a name="l00412"></a>00412 <span class="comment">    This is read-only.</span>
<a name="l00413"></a>00413 <span class="comment">    \par</span>
<a name="l00414"></a>00414 <span class="comment">    To read the board's version, send the message</span>
<a name="l00415"></a>00415 <span class="comment">    \verbatim /system/version \endverbatim</span>
<a name="l00416"></a>00416 <span class="comment"></span>
<a name="l00417"></a>00417 <span class="comment">    \par Stack Audit</span>
<a name="l00418"></a>00418 <span class="comment">    The \b stack-audit property can fire up a task that will monitor the stack usage</span>
<a name="l00419"></a>00419 <span class="comment">    of all tasks running on the board.  If the remaining stack of any of the tasks drops below 50 bytes,</span>
<a name="l00420"></a>00420 <span class="comment">    the board will attempt to send an OSC message back via the \ref Debug system to let you know.</span>
<a name="l00421"></a>00421 <span class="comment">    \par</span>
<a name="l00422"></a>00422 <span class="comment">    This uses up quite a lot of processor time, so it's really only designed to be used in a </span>
<a name="l00423"></a>00423 <span class="comment">    debug context.</span>
<a name="l00424"></a>00424 <span class="comment">    \par</span>
<a name="l00425"></a>00425 <span class="comment">    To start up the stack audit, send the message</span>
<a name="l00426"></a>00426 <span class="comment">    \verbatim /system/stack-audit 1 \endverbatim</span>
<a name="l00427"></a>00427 <span class="comment">    \par</span>
<a name="l00428"></a>00428 <span class="comment">    and turn it off by sending </span>
<a name="l00429"></a>00429 <span class="comment">    \verbatim /system/stack-audit 0 \endverbatim</span>
<a name="l00430"></a>00430 <span class="comment">    </span>
<a name="l00431"></a>00431 <span class="comment">    \par Task Report</span>
<a name="l00432"></a>00432 <span class="comment">    The \b task-report property is a read-only property that will generate a list of all the tasks running </span>
<a name="l00433"></a>00433 <span class="comment">    on your Make Controller, first giving the name of the task followed by the task's remaining stack.</span>
<a name="l00434"></a>00434 <span class="comment">    \par</span>
<a name="l00435"></a>00435 <span class="comment">    To see the tasks running on your board, send the message</span>
<a name="l00436"></a>00436 <span class="comment">    \verbatim /system/task-report \endverbatim</span>
<a name="l00437"></a>00437 <span class="comment">   </span>
<a name="l00438"></a>00438 <span class="comment">    \par Active</span>
<a name="l00439"></a>00439 <span class="comment">    The \b active property corresponds to the active state of System.</span>
<a name="l00440"></a>00440 <span class="comment">    If System is set to be inactive, it will not respond to any other OSC messages. </span>
<a name="l00441"></a>00441 <span class="comment">    If you're not seeing appropriate</span>
<a name="l00442"></a>00442 <span class="comment">    responses to your messages to System, check the whether it's</span>
<a name="l00443"></a>00443 <span class="comment">    active by sending a message like</span>
<a name="l00444"></a>00444 <span class="comment">    \verbatim /system/active \endverbatim</span>
<a name="l00445"></a>00445 <span class="comment">    \par</span>
<a name="l00446"></a>00446 <span class="comment">    You can set the active flag by sending</span>
<a name="l00447"></a>00447 <span class="comment">    \verbatim /system/active 1 \endverbatim</span>
<a name="l00448"></a>00448 <span class="comment">*/</span>
<a name="l00449"></a>00449 
<a name="l00450"></a>00450 <span class="keyword">static</span> <span class="keywordtype">char</span>* SystemOsc_Name = <span class="stringliteral">"system"</span>;
<a name="l00451"></a>00451 <span class="keyword">static</span> <span class="keywordtype">char</span>* SystemOsc_PropertyNames[] = { <span class="stringliteral">"active"</span>, <span class="stringliteral">"freememory"</span>, <span class="stringliteral">"samba"</span>, <span class="stringliteral">"reset"</span>, 
<a name="l00452"></a>00452                                             <span class="stringliteral">"serialnumber"</span>, <span class="stringliteral">"version"</span>,
<a name="l00453"></a>00453                                             <span class="stringliteral">"name"</span>, <span class="stringliteral">"info-internal"</span>, <span class="stringliteral">"info"</span>, <span class="stringliteral">"stack-audit"</span>, 
<a name="l00454"></a>00454                                             <span class="stringliteral">"task-report"</span>, <span class="stringliteral">"autosend-usb"</span>, <span class="stringliteral">"autosend-udp"</span>, <span class="stringliteral">"autosend-interval"</span>, 0 }; <span class="comment">// must have a trailing 0</span>
<a name="l00455"></a>00455 
<a name="l00456"></a>00456 <span class="keywordtype">int</span> SystemOsc_PropertySet( <span class="keywordtype">int</span> property, <span class="keywordtype">char</span>* typedata, <span class="keywordtype">int</span> channel );
<a name="l00457"></a>00457 <span class="keywordtype">int</span> SystemOsc_PropertyGet( <span class="keywordtype">int</span> property, <span class="keywordtype">int</span> channel );
<a name="l00458"></a>00458 
<a name="l00459"></a>00459 <span class="keyword">const</span> <span class="keywordtype">char</span>* SystemOsc_GetName( <span class="keywordtype">void</span> )
<a name="l00460"></a>00460 {
<a name="l00461"></a>00461   <span class="keywordflow">return</span> SystemOsc_Name;
<a name="l00462"></a>00462 }
<a name="l00463"></a>00463 <span class="comment">// need to allow this to accept non-int arguments</span>
<a name="l00464"></a>00464 <span class="keywordtype">int</span> SystemOsc_ReceiveMessage( <span class="keywordtype">int</span> channel, <span class="keywordtype">char</span>* message, <span class="keywordtype">int</span> length )
<a name="l00465"></a>00465 {
<a name="l00466"></a>00466   <span class="keywordtype">int</span> status = <a class="code" href="group___o_s_c_a_p_i.html#gbb24f5e4a4c94eef2c321020941c45b3" title="Receive data for a subsystem that receives a variety of different data types.">Osc_GeneralReceiverHelper</a>( channel, message, length, 
<a name="l00467"></a>00467                                 SystemOsc_Name,
<a name="l00468"></a>00468                                 SystemOsc_PropertySet, SystemOsc_PropertyGet, 
<a name="l00469"></a>00469                                 SystemOsc_PropertyNames );
<a name="l00470"></a>00470 
<a name="l00471"></a>00471   <span class="keywordflow">if</span> ( status != <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a> )
<a name="l00472"></a>00472     <span class="keywordflow">return</span> Osc_SendError( channel, SystemOsc_Name, status );
<a name="l00473"></a>00473 
<a name="l00474"></a>00474   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00475"></a>00475 }
<a name="l00476"></a>00476 
<a name="l00477"></a>00477 <span class="keywordtype">int</span> SystemOsc_Poll( )
<a name="l00478"></a>00478 {
<a name="l00479"></a>00479   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00480"></a>00480 }
<a name="l00481"></a>00481 
<a name="l00482"></a>00482 <span class="comment">// Set the index LED, property with the value</span>
<a name="l00483"></a>00483 <span class="keywordtype">int</span> SystemOsc_PropertySet( <span class="keywordtype">int</span> property, <span class="keywordtype">char</span>* typedata, <span class="keywordtype">int</span> channel )
<a name="l00484"></a>00484 {
<a name="l00485"></a>00485   <span class="keywordtype">int</span> value = 0;
<a name="l00486"></a>00486   <span class="keywordflow">switch</span> ( property )
<a name="l00487"></a>00487   {
<a name="l00488"></a>00488     <span class="keywordflow">case</span> 0: <span class="comment">// active</span>
<a name="l00489"></a>00489     {
<a name="l00490"></a>00490       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00491"></a>00491       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00492"></a>00492         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00493"></a>00493 
<a name="l00494"></a>00494       <a class="code" href="group___system.html#g1d44df5bbae21dd02c41910ae7ffd706" title="Sets whether the System subsystem is active.">System_SetActive</a>( value );
<a name="l00495"></a>00495       <span class="keywordflow">break</span>;
<a name="l00496"></a>00496     }
<a name="l00497"></a>00497     <span class="keywordflow">case</span> 2: <span class="comment">// samba</span>
<a name="l00498"></a>00498     {
<a name="l00499"></a>00499       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00500"></a>00500       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00501"></a>00501         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00502"></a>00502 
<a name="l00503"></a>00503       <a class="code" href="group___system.html#g2c73f861f3856f1189f139d08835f8c1" title="Returns the board to SAM-BA mode, erasing the flash memory.">System_SetSamba</a>( value );
<a name="l00504"></a>00504       <span class="keywordflow">break</span>;
<a name="l00505"></a>00505     }
<a name="l00506"></a>00506     <span class="keywordflow">case</span> 3: <span class="comment">// reset</span>
<a name="l00507"></a>00507     {
<a name="l00508"></a>00508       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00509"></a>00509       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00510"></a>00510         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00511"></a>00511 
<a name="l00512"></a>00512       <a class="code" href="group___system.html#g70fc8e90a5c3dd0a36f7c2b4fe0a8bfc" title="Reset the board.">System_SetReset</a>( value );
<a name="l00513"></a>00513       <span class="keywordflow">break</span>;
<a name="l00514"></a>00514     }
<a name="l00515"></a>00515     <span class="keywordflow">case</span> 4: <span class="comment">// serialnumber</span>
<a name="l00516"></a>00516     {
<a name="l00517"></a>00517       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00518"></a>00518       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00519"></a>00519         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00520"></a>00520 
<a name="l00521"></a>00521       <a class="code" href="group___system.html#g158e76fe4fcb24e3cce77d64c9e018ed" title="Sets the Serial Number.">System_SetSerialNumber</a>( value );
<a name="l00522"></a>00522       <span class="keywordflow">break</span>;
<a name="l00523"></a>00523     }
<a name="l00524"></a>00524     <span class="keywordflow">case</span> 6: <span class="comment">// name</span>
<a name="l00525"></a>00525     {
<a name="l00526"></a>00526       <span class="keywordtype">char</span>* address;
<a name="l00527"></a>00527       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"s"</span>, &amp;address );
<a name="l00528"></a>00528       <span class="keywordflow">if</span> ( count != 1 ) 
<a name="l00529"></a>00529         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need a string"</span> );
<a name="l00530"></a>00530 
<a name="l00531"></a>00531       <a class="code" href="group___system.html#gfba0e52d7c1b37ba36cf8172e005ffd1" title="Gives the board a name.">System_SetName</a>( address );
<a name="l00532"></a>00532       <span class="keywordflow">break</span>;
<a name="l00533"></a>00533     }
<a name="l00534"></a>00534     <span class="keywordflow">case</span> 9: <span class="comment">// stack-audit</span>
<a name="l00535"></a>00535     {
<a name="l00536"></a>00536       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00537"></a>00537       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00538"></a>00538         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00539"></a>00539 
<a name="l00540"></a>00540       System_StackAudit( value );
<a name="l00541"></a>00541       <span class="keywordflow">break</span>;
<a name="l00542"></a>00542     }
<a name="l00543"></a>00543     <span class="keywordflow">case</span> 11: <span class="comment">// autosend-usb</span>
<a name="l00544"></a>00544     {
<a name="l00545"></a>00545       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00546"></a>00546       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00547"></a>00547         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00548"></a>00548       <span class="keywordflow">if</span>( value )
<a name="l00549"></a>00549         System_SetAsyncDestination( OSC_CHANNEL_USB );
<a name="l00550"></a>00550       <span class="keywordflow">else</span>
<a name="l00551"></a>00551       {
<a name="l00552"></a>00552         <span class="keywordflow">if</span>( System_GetAsyncDestination( ) == OSC_CHANNEL_USB )
<a name="l00553"></a>00553           System_SetAsyncDestination( ASYNC_INACTIVE );
<a name="l00554"></a>00554       }
<a name="l00555"></a>00555       <span class="keywordflow">break</span>;
<a name="l00556"></a>00556     }
<a name="l00557"></a>00557     <span class="keywordflow">case</span> 12: <span class="comment">// autosend-udp</span>
<a name="l00558"></a>00558     {
<a name="l00559"></a>00559       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00560"></a>00560       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00561"></a>00561         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00562"></a>00562       <span class="keywordflow">if</span>( value )
<a name="l00563"></a>00563         System_SetAsyncDestination( OSC_CHANNEL_UDP );
<a name="l00564"></a>00564       <span class="keywordflow">else</span>
<a name="l00565"></a>00565       {
<a name="l00566"></a>00566         <span class="keywordflow">if</span>( System_GetAsyncDestination( ) == OSC_CHANNEL_UDP )
<a name="l00567"></a>00567           System_SetAsyncDestination( ASYNC_INACTIVE );
<a name="l00568"></a>00568       }
<a name="l00569"></a>00569       <span class="keywordflow">break</span>;
<a name="l00570"></a>00570     }
<a name="l00571"></a>00571     <span class="keywordflow">case</span> 13: <span class="comment">// autosend-interval</span>
<a name="l00572"></a>00572     {
<a name="l00573"></a>00573       <span class="keywordtype">int</span> count = Osc_ExtractData( typedata, <span class="stringliteral">"i"</span>, &amp;value );
<a name="l00574"></a>00574       <span class="keywordflow">if</span> ( count != 1 )
<a name="l00575"></a>00575         <span class="keywordflow">return</span> <a class="code" href="group___o_s_c_a_p_i.html#g852200f3d0612d90d73e9f233392ec2d" title="Send an error back via OSC from your subsystem.">Osc_SubsystemError</a>( channel, SystemOsc_Name, <span class="stringliteral">"Incorrect data - need an int"</span> );
<a name="l00576"></a>00576 
<a name="l00577"></a>00577       System_SetAutoSendInterval( value );
<a name="l00578"></a>00578       <span class="keywordflow">break</span>;
<a name="l00579"></a>00579     }
<a name="l00580"></a>00580   }
<a name="l00581"></a>00581   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00582"></a>00582 }
<a name="l00583"></a>00583 
<a name="l00584"></a>00584 <span class="comment">// Get the property</span>
<a name="l00585"></a>00585 <span class="keywordtype">int</span> SystemOsc_PropertyGet( <span class="keywordtype">int</span> property, <span class="keywordtype">int</span> channel )
<a name="l00586"></a>00586 {
<a name="l00587"></a>00587   <span class="keywordtype">int</span> value = 0;
<a name="l00588"></a>00588   <span class="comment">//char address[ OSC_SCRATCH_SIZE ];</span>
<a name="l00589"></a>00589   <span class="keywordflow">switch</span> ( property )
<a name="l00590"></a>00590   {
<a name="l00591"></a>00591     <span class="keywordflow">case</span> 0: <span class="comment">// active</span>
<a name="l00592"></a>00592       value = <a class="code" href="group___system.html#gf69f323f13e699e179290d1857ef2ef8" title="Returns the active state of the subsystem.">System_GetActive</a>( );
<a name="l00593"></a>00593       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00594"></a>00594       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",i"</span>, value ); 
<a name="l00595"></a>00595       <span class="keywordflow">break</span>;
<a name="l00596"></a>00596     <span class="keywordflow">case</span> 1: <span class="comment">// freememory</span>
<a name="l00597"></a>00597       value = <a class="code" href="group___system.html#g70856cdb0248591e1ddc44d1ca96e475" title="Returns the free size of the heap.">System_GetFreeMemory</a>( );
<a name="l00598"></a>00598       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00599"></a>00599       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",i"</span>, value ); 
<a name="l00600"></a>00600       <span class="keywordflow">break</span>;
<a name="l00601"></a>00601     <span class="keywordflow">case</span> 4: <span class="comment">// serialnumber</span>
<a name="l00602"></a>00602       value = <a class="code" href="group___system.html#g42dad93cdc36c55a34f225982a0ff753" title="Gets the board&amp;#39;s Serial Number.">System_GetSerialNumber</a>( );
<a name="l00603"></a>00603       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00604"></a>00604       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",i"</span>, value ); 
<a name="l00605"></a>00605       <span class="keywordflow">break</span>;  
<a name="l00606"></a>00606     <span class="keywordflow">case</span> 5: <span class="comment">// version</span>
<a name="l00607"></a>00607     {
<a name="l00608"></a>00608       <span class="keywordtype">char</span> versionString[50];
<a name="l00609"></a>00609       snprintf( versionString, 50, <span class="stringliteral">"%s %d.%d.%d"</span>, FIRMWARE_NAME, FIRMWARE_MAJOR_VERSION, FIRMWARE_MINOR_VERSION, FIRMWARE_BUILD_NUMBER );
<a name="l00610"></a>00610       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00611"></a>00611       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",s"</span>, versionString ); 
<a name="l00612"></a>00612       <span class="keywordflow">break</span>;
<a name="l00613"></a>00613     }
<a name="l00614"></a>00614     <span class="keywordflow">case</span> 6: <span class="comment">// name</span>
<a name="l00615"></a>00615     {
<a name="l00616"></a>00616       <span class="keywordtype">char</span>* name;
<a name="l00617"></a>00617       name = <a class="code" href="group___system.html#g1bcad57269385df99b23c8e9de3f81fc" title="Read the board&amp;#39;s name.">System_GetName</a>( );
<a name="l00618"></a>00618       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00619"></a>00619       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",s"</span>, name ); 
<a name="l00620"></a>00620       <span class="keywordflow">break</span>;
<a name="l00621"></a>00621     }
<a name="l00622"></a>00622     <span class="keywordflow">case</span> 7: <span class="comment">// info-internal</span>
<a name="l00623"></a>00623     <span class="keywordflow">case</span> 8: <span class="comment">// info</span>
<a name="l00624"></a>00624     {
<a name="l00625"></a>00625       <span class="keywordtype">int</span> a0, a1, a2, a3;
<a name="l00626"></a>00626       { <span class="comment">// put these in their own context so the local variables aren't lying around on the stack for the whole message</span>
<a name="l00627"></a>00627         <span class="keywordtype">char</span> ipAddr[25];
<a name="l00628"></a>00628         <span class="keywordtype">char</span>* sysName = <a class="code" href="group___system.html#g1bcad57269385df99b23c8e9de3f81fc" title="Read the board&amp;#39;s name.">System_GetName</a>( );
<a name="l00629"></a>00629         <span class="keywordtype">int</span> serialnum = <a class="code" href="group___system.html#g42dad93cdc36c55a34f225982a0ff753" title="Gets the board&amp;#39;s Serial Number.">System_GetSerialNumber</a>( );
<a name="l00630"></a>00630         <span class="keywordtype">char</span> sysVersion[25];
<a name="l00631"></a>00631         snprintf( sysVersion, 25, <span class="stringliteral">"%s %d.%d.%d"</span>, FIRMWARE_NAME, FIRMWARE_MAJOR_VERSION, FIRMWARE_MINOR_VERSION, FIRMWARE_BUILD_NUMBER );
<a name="l00632"></a>00632         <span class="keywordtype">int</span> freemem = <a class="code" href="group___system.html#g70856cdb0248591e1ddc44d1ca96e475" title="Returns the free size of the heap.">System_GetFreeMemory</a>( );
<a name="l00633"></a>00633 <span class="preprocessor">        #ifdef MAKE_CTRL_NETWORK</span>
<a name="l00634"></a>00634 <span class="preprocessor"></span>        <span class="keywordflow">if</span>( <a class="code" href="group___network.html#gf5c24462c4ca5bfcf8a9ffdb80c290d8" title="Read the board&amp;#39;s current IP address.">Network_GetAddress</a>( &amp;a0, &amp;a1, &amp;a2, &amp;a3 ) != <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a> )
<a name="l00635"></a>00635           a0 = a1 = a2 = a3 = -1;
<a name="l00636"></a>00636 <span class="preprocessor">        #else</span>
<a name="l00637"></a>00637 <span class="preprocessor"></span>        a0 = a1 = a2 = a3 = -1;
<a name="l00638"></a>00638 <span class="preprocessor">        #endif // MAKE_CTRL_NETWORK</span>
<a name="l00639"></a>00639 <span class="preprocessor"></span>        snprintf( ipAddr, 25, <span class="stringliteral">"%d.%d.%d.%d"</span>, a0, a1, a2, a3 );
<a name="l00640"></a>00640         snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s-a"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00641"></a>00641         Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",sissi"</span>, sysName, serialnum, ipAddr, sysVersion, freemem );
<a name="l00642"></a>00642       }
<a name="l00643"></a>00643       {
<a name="l00644"></a>00644       <span class="keywordtype">char</span> gateway[25];
<a name="l00645"></a>00645       <span class="keywordtype">char</span> mask[25];
<a name="l00646"></a>00646       <span class="keywordtype">int</span> dhcp;
<a name="l00647"></a>00647       <span class="keywordtype">int</span> webserver;
<a name="l00648"></a>00648       <span class="keywordtype">int</span> oscUdpListen;
<a name="l00649"></a>00649       <span class="keywordtype">int</span> oscUdpSend; 
<a name="l00650"></a>00650 <span class="preprocessor">      #ifdef MAKE_CTRL_NETWORK</span>
<a name="l00651"></a>00651 <span class="preprocessor"></span>      <span class="keywordflow">if</span>( <a class="code" href="group___network.html#ge91ce5f124fcfbabc529d75fc222d49e" title="Read the board&amp;#39;s current gateway address.">Network_GetGateway</a>( &amp;a0, &amp;a1, &amp;a2, &amp;a3 ) != <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a> )
<a name="l00652"></a>00652         a0 = a1 = a2 = a3 = -1;
<a name="l00653"></a>00653       snprintf( gateway, 25, <span class="stringliteral">"%d.%d.%d.%d"</span>, a0, a1, a2, a3 );
<a name="l00654"></a>00654       <span class="keywordflow">if</span>( <a class="code" href="group___network.html#ga0837a01a5bd814cae2a080f8b2bf86b" title="Read the board&amp;#39;s current network mask.">Network_GetMask</a>( &amp;a0, &amp;a1, &amp;a2, &amp;a3 ) != <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a> )
<a name="l00655"></a>00655         a0 = a1 = a2 = a3 = -1;
<a name="l00656"></a>00656       snprintf( mask, 25, <span class="stringliteral">"%d.%d.%d.%d"</span>, a0, a1, a2, a3 );
<a name="l00657"></a>00657       dhcp = <a class="code" href="group___network.html#ge24b6f9eecab6b6339bfc19524ff3f60" title="Read whether DHCP is currently enabled.">Network_GetDhcpEnabled</a>( );
<a name="l00658"></a>00658       webserver = <a class="code" href="group___network.html#g371af21b1030735315a0c101aee27ace" title="Read whether the demo webserver is enabled.">Network_GetWebServerEnabled</a>( );
<a name="l00659"></a>00659       oscUdpListen = NetworkOsc_GetUdpListenPort( );
<a name="l00660"></a>00660       oscUdpSend = NetworkOsc_GetUdpSendPort( );
<a name="l00661"></a>00661 <span class="preprocessor">      #else</span>
<a name="l00662"></a>00662 <span class="preprocessor"></span>      a0 = a1 = a2 = a3 = -1;
<a name="l00663"></a>00663       snprintf( gateway, 25, <span class="stringliteral">"%d.%d.%d.%d"</span>, a0, a1, a2, a3 );
<a name="l00664"></a>00664       snprintf( mask, 25, <span class="stringliteral">"%d.%d.%d.%d"</span>, a0, a1, a2, a3 );
<a name="l00665"></a>00665       dhcp = 0;
<a name="l00666"></a>00666       webserver = 0;
<a name="l00667"></a>00667       oscUdpListen = 0;
<a name="l00668"></a>00668       oscUdpSend = 0;
<a name="l00669"></a>00669 <span class="preprocessor">      #endif // MAKE_CTRL_NETWORK</span>
<a name="l00670"></a>00670 <span class="preprocessor"></span>      
<a name="l00671"></a>00671       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s-b"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00672"></a>00672       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",iissii"</span>, dhcp, webserver, gateway, mask, oscUdpListen, oscUdpSend );
<a name="l00673"></a>00673       }
<a name="l00674"></a>00674       <span class="keywordflow">break</span>;
<a name="l00675"></a>00675     }
<a name="l00676"></a>00676     <span class="keywordflow">case</span> 9: <span class="comment">// stack-audit</span>
<a name="l00677"></a>00677       <span class="keywordflow">if</span>( System-&gt;StackAuditPtr == NULL )
<a name="l00678"></a>00678         value = 0;
<a name="l00679"></a>00679       <span class="keywordflow">else</span>
<a name="l00680"></a>00680         value = 1;
<a name="l00681"></a>00681       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00682"></a>00682       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",i"</span>, value ); 
<a name="l00683"></a>00683       <span class="keywordflow">break</span>;
<a name="l00684"></a>00684     <span class="keywordflow">case</span> 10: <span class="comment">// task-report</span>
<a name="l00685"></a>00685     {
<a name="l00686"></a>00686       <span class="keywordtype">int</span> numOfTasks = <a class="code" href="group___tasks.html#g87597a6d75dce6de737707604d4267ce" title="Get the total number of tasks that exist at a given moment.">GetNumberOfTasks</a>( ) - 1;  <span class="comment">// don't count the IDLE task</span>
<a name="l00687"></a>00687       <span class="keywordtype">int</span> i;
<a name="l00688"></a>00688       <span class="keywordtype">void</span>* task = NULL;
<a name="l00689"></a>00689       <span class="keywordtype">char</span>* taskName = <span class="stringliteral">""</span>;
<a name="l00690"></a>00690       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00691"></a>00691       
<a name="l00692"></a>00692       <span class="keywordflow">for</span>( i = 0; i &lt; numOfTasks; i++ )
<a name="l00693"></a>00693       {
<a name="l00694"></a>00694         task = <a class="code" href="group___tasks.html#ga8d7aef54edaea894b5f5e9cd6c53eae" title="Get a pointer to the task whose ID comes after a given ID.">TaskGetNext</a>( task );
<a name="l00695"></a>00695         value = <a class="code" href="group___tasks.html#gbce595eac3d0cfb96b1cd9037a613ef8" title="Check how much stack is available for a given task.">TaskGetRemainingStack</a>( task );
<a name="l00696"></a>00696         taskName = <a class="code" href="group___tasks.html#ga15296e2b927abaadce9ed3028917afd" title="Get the name of a task.">TaskGetName</a>( task );
<a name="l00697"></a>00697         Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",si"</span>, taskName, value ); 
<a name="l00698"></a>00698       }
<a name="l00699"></a>00699       <span class="keywordflow">break</span>;
<a name="l00700"></a>00700     }
<a name="l00701"></a>00701     <span class="keywordflow">case</span> 11: <span class="comment">// autosend-usb</span>
<a name="l00702"></a>00702       value = ( System_GetAsyncDestination( ) == OSC_CHANNEL_USB ) ? 1 : 0;
<a name="l00703"></a>00703       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00704"></a>00704       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",i"</span>, value ); 
<a name="l00705"></a>00705       <span class="keywordflow">break</span>;
<a name="l00706"></a>00706     <span class="keywordflow">case</span> 12: <span class="comment">// autosend-udp</span>
<a name="l00707"></a>00707       value = ( System_GetAsyncDestination( ) == OSC_CHANNEL_UDP ) ? 1 : 0;
<a name="l00708"></a>00708       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00709"></a>00709       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",i"</span>, value ); 
<a name="l00710"></a>00710       <span class="keywordflow">break</span>;
<a name="l00711"></a>00711     <span class="keywordflow">case</span> 13: <span class="comment">// autosend-interval</span>
<a name="l00712"></a>00712       value = System_GetAutoSendInterval( );
<a name="l00713"></a>00713       snprintf( System-&gt;scratch1, OSC_SCRATCH_SIZE, <span class="stringliteral">"/%s/%s"</span>, SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); 
<a name="l00714"></a>00714       Osc_CreateMessage( channel, System-&gt;scratch1, <span class="stringliteral">",i"</span>, value ); 
<a name="l00715"></a>00715       <span class="keywordflow">break</span>; 
<a name="l00716"></a>00716   }
<a name="l00717"></a>00717   
<a name="l00718"></a>00718   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00719"></a>00719 }
<a name="l00720"></a>00720 
<a name="l00721"></a>00721 <span class="preprocessor">#endif // OSC</span>
</pre></div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Make Controller Kit</title>
<style type="text/css">
<!--
.footer {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 9pt;
	color: #999999;
}
-->
</style>
</head>

<body>
<hr size="1">
<div>
  <p class="footer">The Make Controller Kit is an open source project maintained by <a href="http://www.makingthings.com">MakingThings</a>.<br />
    MakingThings code is released under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">Apache 2.0 license</a>.<br />
    Bug tracker, development wiki and status can be found at <a href="http://dev.makingthings.com">http://dev.makingthings.com</a>.<br />
		This document was last updated on 5 Dec 2007.
</p>
</div>
<!-- Google Analytics Code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-769030-1";
urchinTracker();
</script>
</body>
</html>
